home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume15 / dmake-3.6 / part12 < prev    next >
Encoding:
Text File  |  1990-10-14  |  39.5 KB  |  1,093 lines

  1. Newsgroups: comp.sources.misc
  2. X-UNIX-From: dvadura@watdragon.waterloo.edu
  3. subject: v15i064: dmake version 3.6 (part 12/25)
  4. from: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  5. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  6.  
  7. Posting-number: Volume 15, Issue 64
  8. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  9. Archive-name: dmake-3.6/part12
  10.  
  11. #!/bin/sh
  12. # this is part 12 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file man/dmake.tf continued
  15. #
  16. CurArch=12
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file man/dmake.tf"
  27. sed 's/^X//' << 'SHAR_EOF' >> man/dmake.tf
  28. Xto introduce options on command lines.  On UNIX it's value is '-', on
  29. XMSDOS it's value may be '/' or '-'.
  30. XThe macro is internally defined and is not user setable.
  31. XThe MSDOS version of \fBdmake\fP attempts to first extract SWITCHAR from an
  32. Xenvironment variable of the same name.  If that fails it then attempts to
  33. Xuse the undocumented getswitchar interrupt call, and returns the result of
  34. Xthat.  Thus under MSDOS version 4.0 you must set the value of the environment
  35. Xmacro SWITCHAR to '/' to obtain predictable behaviour.
  36. X.PP
  37. XAll boolean macros currently understood by 
  38. X.B dmake
  39. Xcorrespond directly to the previously defined attributes.
  40. XThese macros provide
  41. Xa second way to apply global attributes, and represent the
  42. Xpreferred method of doing so.  They are used by assigning them a
  43. Xvalue.  If the value is not a NULL string then the boolean condition
  44. Xis set to on.
  45. XIf the value is a NULL string then the condition is set to off.
  46. XThere are five conditions defined and they correspond directly to the
  47. Xattributes of the same name.  Their meanings are defined in the ATTRIBUTES
  48. Xsection above.
  49. XThe macros are:
  50. X\&\fB.EPILOG\fP,
  51. X\&\fB.IGNORE\fP,
  52. X\&\fB.MKSARGS\fP,
  53. X\&\fB.PRECIOUS\fP,
  54. X\&\fB.PROLOG\fP,
  55. X\&\fB.SEQUENTIAL\fP,
  56. X\&\fB.SILENT\fP,
  57. X\&\fB.SWAP\fP, and
  58. X\&\fB.USESHELL\fP.
  59. XAssigning any of these a non NULL value will globally set
  60. Xthe corresponding attribute to on.
  61. X.SH "RUN_TIME MACROS"
  62. XThese macros are defined
  63. Xwhen \fBdmake\fP is making targets, and may take on different values for each
  64. Xtarget.  \fB$@\fP is defined to be the full target name, \fB$?\fP is the
  65. Xlist of all out of date prerequisites, \fB$&\fP is the list of all
  66. Xprerequisites, \fB$>\fP is the name of the library if the current target is a
  67. Xlibrary member, and
  68. X\fB$<\fP is the list of prerequisites specified in the current rule.
  69. XIf the current target had a recipe inferred then \fB$<\fP is the name of the
  70. Xinferred prerequisite even if the target had a list of prerequisites supplied
  71. Xusing an explicit rule that did not provide a recipe.  In such situations
  72. X\fB$&\fP gives the full list of prerequisites.
  73. X.PP
  74. X\fB$*\fP is defined as
  75. X\fB$(@:db)\fP when making targets with explicit recipes and is defined as the
  76. Xvalue of % when making targets whose recipe is the result of an inference.
  77. XIn the first case \fB$*\fP is the target name with no suffix,
  78. Xand in the second case, is the value of the matched % pattern from
  79. Xthe associated %-rule.
  80. X\fB$^\fP expands to the set of out of date prerequisites taken from the
  81. Xcurrent value of \fB$<\fP.
  82. XIn addition to these,
  83. X\fB$$\fP expands to $, \fB{{\fP expands to {, \fB}}\fP expands to }, and the
  84. Xstrings \fB<+\fP and \fB+>\fP are recognized
  85. Xas respectively starting and terminating a text diversion when they appear
  86. Xliterally together in the same input line.
  87. X.PP
  88. XThe difference between $? and $^ can best be illustrated by an example,
  89. Xconsider:
  90. X.RS
  91. X.sp
  92. X.nf
  93. Xfred.out : joe amy hello
  94. X\trules for making fred
  95. X
  96. Xfred.out : my.c your.h his.h her.h      # more prerequisites
  97. X.fi
  98. X.sp
  99. X.RE
  100. XAssume joe, amy, and my.c are newer then fred.out.  When
  101. X.B dmake
  102. Xexecutes the recipe for making fred.out the values of the following macros
  103. Xwill be:
  104. X.RS
  105. X.sp
  106. X.nf
  107. X.Is "$@ "
  108. X.Ii "$@"
  109. X--> fred.out
  110. X.Ii "$*"
  111. X--> fred
  112. X.Ii "$?"
  113. X--> joe amy my.c  # note the difference between $? and $^
  114. X.Ii "$^"
  115. X--> joe amy
  116. X.Ii "$<"
  117. X--> joe amy hello
  118. X.Ii "$&"
  119. X--> joe amy hello my.c your.h his.h her.h
  120. X.fi
  121. X.sp
  122. X.RE
  123. X.SH "FUNCTION MACROS"
  124. XOnly one function macro is defined at this time.  The $(mktmp ...) construct
  125. Xcan be used to create a temporary file containing data and returns the name
  126. Xof that file as it's result.  See the TEXT DIVERSION section for details on
  127. Xits use.  Temporary files created using this macro persist for the duration
  128. Xof the
  129. X.B dmake
  130. Xrun if processed as part of a macro assignment operation, or until an
  131. Xassociated target's recipe is fully completed at which time the temporary file
  132. Xis removed.  NOTE:  Specifying '-v' on the command line causes all temporary
  133. Xfiles to be retained when
  134. X.B dmake
  135. Xexits.
  136. X.SH "DYNAMIC PREREQUISITES"
  137. X.B dmake
  138. Xlooks for prerequisites whose names contain macro expansions during target
  139. Xprocessing.  Any such prerequisites are expanded and the result of the
  140. Xexpansion is used as the prerequisite name.  As an example the line:
  141. X.sp
  142. X\tfred : $$@.c
  143. X.sp
  144. Xcauses the $$@ to be expanded when \fBdmake\fP is making fred, and it resolves
  145. Xto the target \fIfred\fP.
  146. XThis enables dynamic prerequisites to be generated.  The value
  147. Xof @ may be modified by any of the valid macro modifiers.  So you can say for
  148. Xexample:
  149. X.sp
  150. X\tfred.out : $$(@:b).c
  151. X.sp
  152. Xwhere the $$(@:b) expands to \fIfred\fP.
  153. XNote the use of $$ instead of $ to indicate the dynamic expansion, this
  154. Xis due to the fact that the rule line is expanded when it is initially parsed,
  155. Xand $$ then returns $ which later triggers the dynamic prerequisite expansion.
  156. XIf you really want a $ to be part of a prerequisite name you must use $$$$.
  157. XDynamic macro expansion is performed in all user defined rules,
  158. Xand the special targets .SOURCE*, and .INCLUDEDIRS.
  159. X.SH "BINDING TARGETS"
  160. XThis operation takes a target name and binds it to an existing file, if
  161. Xpossible.
  162. X.B dmake
  163. Xmakes a distinction between the internal target name of a target and it's
  164. Xassociated external file name.
  165. XThus it is possible for a target's internal name and its external
  166. Xfile name to differ.
  167. XTo perform the binding, the following set of rules is used.
  168. XAssume that we are
  169. Xtrying to bind a target whose name is of the form \fIX.suff\fP,
  170. Xwhere \fI.suff\fP is the suffix and \fIX\fP is the stem portion
  171. X(ie. that part which contains the directory and the basename).
  172. X.B dmake
  173. Xtakes this target name and performs a series of search operations that try to
  174. Xfind a suitably named file in the external file system.
  175. XThe search operation is user controlled
  176. Xvia the settings of the various .SOURCE targets.
  177. X.RS
  178. X.IP 1.
  179. XIf target has the .SYMBOL attribute set then look for it in the library.
  180. XIf found, replace the target name with the library member name and continue
  181. Xwith step 2.  If the name is not found then return.
  182. X.IP 2.
  183. XExtract the suffix portion (that following the `.') of the target name.
  184. XIf the suffix is not null, look up the special target .SOURCE.<suff>
  185. X(<suff> is the suffix).  
  186. XIf the special target exists then search each directory given in
  187. Xthe .SOURCE.<suff> prerequisite list for the target.
  188. XIf the target's suffix was null (ie. \fI.suff\fP was empty) then 
  189. Xperform the above search but use the special target .SOURCE.NULL instead.
  190. XIf at any point a match is found then terminate the search.
  191. XIf a directory in the prerequisite list is the special name `.NULL ' perform
  192. Xa search for the full target name without prepending any directory portion
  193. X(ie. prepend the NULL directory).
  194. X(a default target of '.SOURCE : .NULL' is defined by \fBdmake\fP at startup,
  195. Xand is user redefinable)
  196. X.IP 3.
  197. XThe search in step 2. failed.  Repeat the same search but this time
  198. Xuse the special target .SOURCE.
  199. X.IP 4.
  200. XThe search in step 3. failed.
  201. XIf the target has the library member attribute (.LIBMEMBER)
  202. Xset then try to find the target in the library which was passed along
  203. Xwith the .LIBMEMBER attribute (see the MAKING LIBRARIES section).
  204. XThe bound file name assigned to a target which is successfully
  205. Xlocated in a library is the same name that would be assigned had the search
  206. Xfailed (see 5.).
  207. X.IP 5.
  208. XThe search failed.  Either the target was not found in any of the search
  209. Xdirectories or no applicable .SOURCE special targets exist.
  210. XIf applicable .SOURCE special targets exist, but the target was not found,
  211. Xthen \fBdmake\fP assigns the first name searched as the bound file name.
  212. XIf no applicable .SOURCE special targets exist,
  213. Xthen the full original target name becomes the bound file name.
  214. X.RE
  215. X.PP
  216. XThere is potential here for a lot of search operations.  The trick is to
  217. Xdefine .SOURCE.x special targets with short search lists and leave .SOURCE
  218. Xas short as possible.
  219. XThe search algorithm has the following useful side effect.
  220. XWhen a target having the .LIBMEMBER (library member) attribute is searched for,
  221. Xit is first searched for as an ordinary file.
  222. XWhen a number of library members require updating it is desirable to compile
  223. Xall of them first and to update the library at the end in a single operation.
  224. XIf one of the members does not compile and \fBdmake\fP stops, then
  225. Xthe user may fix the error and make again.  \fBdmake\fP will not remake any
  226. Xof the targets whose object files have already been generated as long as
  227. Xnone of their prerequisite files have been modified as a result of the fix.
  228. X.PP
  229. XWhen defining .SOURCE and .SOURCE.x targets the construct
  230. X.sp
  231. X\t.SOURCE :
  232. X.br
  233. X\t.SOURCE : fred gery
  234. X.sp
  235. Xis equivalent to
  236. X.sp
  237. X\t.SOURCE :- fred gery
  238. X.PP
  239. X\fBdmake\fP correctly handles the UNIX Make variable VPATH.  By definition VPATH
  240. Xcontains a list of ':' separated directories to search when looking for a
  241. Xtarget.  \fBdmake\fP maps VPATH to the following special rule:
  242. X.sp
  243. X\t.SOURCE :^ $(VPATH:s/:/ /)
  244. X.sp
  245. XWhich takes the value of VPATH and sets .SOURCE to the same set of directories
  246. Xas specified in VPATH.
  247. X.SH "PERCENT(%) RULES AND MAKING INFERENCES"
  248. XWhen \fBdmake\fP makes a target it's set of prerequisites (if any)
  249. Xmust exist and the target must have a recipe which \fBdmake\fP
  250. Xcan use to make it.
  251. XIf the makefile does not specify an explicit recipe for the target then
  252. X.B dmake
  253. Xuses special rules to try to infer a recipe which it can use
  254. Xto make the target.  Previous versions of Make perform this task by using
  255. Xrules that are defined by targets of the form .<suffix>.<suffix> and by
  256. Xusing the .SUFFIXES list of suffixes.  The exact workings of this mechanism
  257. Xwere sometimes difficult to understand and often limiting in their usefulness.
  258. XInstead, \fBdmake\fP supports the concept of \fI%-meta\fP rules.  
  259. XThe syntax and semantics of these rules differ from standard rule lines as
  260. Xfollows:
  261. X.sp
  262. X.nf
  263. X.RS
  264. X\fI<%-target>\fP [\fI<attributes>\fP] \fI<ruleop>\fP [\fI<%-prerequisites>\fP] [;\fI<recipe>\fP]
  265. X.RE
  266. X.fi
  267. X.sp
  268. Xwhere \fI%-target\fP is a target containing exactly a single `%' sign,
  269. X.I attributes
  270. Xis a list (possibly empty) of attributes,
  271. X.I ruleop
  272. Xis the standard set of rule operators,
  273. X.I "%-prerequisites"
  274. X\&, if present, is a list of prerequisites containing zero or more `%' signs,
  275. Xand
  276. X.I recipe,
  277. Xif present, is the first line of the recipe.
  278. X.PP
  279. XThe
  280. X.I %-target
  281. Xdefines a pattern against which a target whose recipe is
  282. Xbeing inferred gets matched.  The pattern match goes as follows:  all chars are
  283. Xmatched exactly from left to right up to but not including the % sign in the
  284. Xpattern, % then matches the longest string from the actual target name
  285. Xnot ending in
  286. Xthe suffix given after the % sign in the pattern.
  287. XConsider the following examples:
  288. X.RS
  289. X.sp
  290. X.nf
  291. X.Is "dir/%.c   "
  292. X.Ii "%.c"
  293. Xmatches fred.c but not joe.c.Z
  294. X.Ii "dir/%.c"
  295. Xmatches dir/fred.c but not dd/fred.c
  296. X.Ii "fred/%"
  297. Xmatches fred/joe.c but not f/joe.c
  298. X.Ii "%"
  299. Xmatches anything
  300. X.fi
  301. X.sp
  302. X.RE
  303. XIn each case the part of the target name that matched the % sign is retained
  304. Xand is substituted for any % signs in the prerequisite list of the %-meta rule
  305. Xwhen the rule is selected during inference and
  306. X.B dmake
  307. Xconstructs the dependency specified by the %-meta rule for the actual target.
  308. XAs an example the following %-meta rules describe the following:
  309. X.RS
  310. X.sp
  311. X%.c : %.y ; recipe...
  312. X.sp
  313. X.RE
  314. Xdescribes how to make any file ending in .c if a corresponding file ending
  315. Xin .y can be found.
  316. X.RS
  317. X.sp
  318. Xfoo%.o : fee%.k ; recipe...
  319. X.sp
  320. X.RE
  321. Xis used to describe how to make fooxxxx.o from feexxxx.k.
  322. X.RS
  323. X.sp
  324. X%.a :; recipe...
  325. X.sp
  326. X.RE
  327. Xdescribes how to make a file whose suffix is .a without inferring any
  328. Xprerequisites.
  329. X.RS
  330. X.sp
  331. X%.c : %.y yaccsrc/%.y ; recipe...
  332. X.sp
  333. X.RE
  334. Xis a short form for the construct:
  335. X.RS
  336. X.sp
  337. X%.c : %.y ; recipe...
  338. X.br
  339. X%.c : yaccsrc/%.y ; recipe...
  340. X.sp
  341. X.RE
  342. Xie. It is possible to specify the same recipe for two %-rules by giving
  343. Xmore than one prerequisite in the prerequisite list.
  344. XA more interesting example is:
  345. X.RS
  346. X.sp
  347. X% : RCS/%,v ; co $@
  348. X.sp
  349. X.RE
  350. Xwhich describes how to take any target and check it out of
  351. Xthe RCS directory if the corresponding file exists in the RCS directory.
  352. XThe equivalent SCCS rule would be:
  353. X.RS
  354. X.sp
  355. X% : s.% ; get $@
  356. X.sp
  357. X.RE
  358. X.PP
  359. XThe previous RCS example defines an infinite rule, because it says how to make
  360. X.I anything
  361. Xfrom RCS/%,v, and
  362. X.I anything
  363. Xalso includes RCS/fred.c,v.
  364. XTo limit the size of the graph that results from such rules
  365. X.B dmake
  366. Xuses the macro variable PREP (stands for % repetition).  By default the value
  367. Xof this variable is 0, which says that no repetitions of a %-rule are to be
  368. Xgenerated.  If it is set to something greater than 0, then that many
  369. Xrepetitions of any infinite %-rule are allowed.  If in the above
  370. Xexample PREP was set to 1, then \fBdmake\fP would generate the dependency
  371. Xgraph:
  372. X.RS
  373. X.sp
  374. X% --> RCS/%,v --> RCS/RCS/%,v,v
  375. X.sp
  376. X.RE
  377. XWhere each link is assigned the same recipe as the first link.
  378. XPREP should be used only in special cases, since it may result in
  379. Xa large increase in the number of possible prerequisites tested.
  380. X.PP
  381. X.B dmake
  382. Xsupports dynamic prerequisite generation for prerequisites of %-meta rules.
  383. XThis is best illustrated by an example.  The RCS rule shown above can infer
  384. Xhow to check out a file from a corresponding RCS file only if the target
  385. Xis a simple file name with no directory information.  That is, the above rule
  386. Xcan infer how to find \fIRCS/fred.c,v\fP from the target \fIfred.c\fP,
  387. Xbut cannot infer how to find \fIsrcdir/RCS/fred.c,v\fP from \fIsrcdir/fred.c\fP
  388. Xbecause the above rule will cause \fBdmake\fP to look for RCS/srcdir/fred.c,v;
  389. Xwhich does not exist (assume that srcdir has it's own RCS directory as is the
  390. Xcommon case).
  391. X.PP
  392. XA more versatile formulation of the above RCS check out rule is the following:
  393. X.RS
  394. X.sp
  395. X% :  $$(@:d)RCS/$$(@:f),v : co $@
  396. X.sp
  397. X.RE
  398. XThis rule uses the dynamic macro $@ to specify the prerequisite to try to
  399. Xinfer.  During inference of this rule the macro $@ is set to the value of
  400. Xthe target of the %-meta rule and the appropriate prerequisite is generated by
  401. Xextracting the directory portion of the target name (if any), appending the
  402. Xstring \fIRCS/\fP to it, and appending the target file name with a trailing
  403. X\fI,v\fP attached to the previous result.
  404. X.PP
  405. X.B dmake
  406. Xcan also infer indirect prerequisites.
  407. XAn inferred target can have a list of prerequisites added that will not
  408. Xshow up in the value of $< but will show up in the value of $? and $&.
  409. XIndirect prerequisites are specified in an inference rule by quoting the
  410. Xprerequisite with single quotes.  For example, if you had the explicit
  411. Xdependency:
  412. X.RS
  413. X.sp
  414. X.nf
  415. Xfred.o : fred.c ; rule to make fred.o
  416. Xfred.o : local.h
  417. X.fi
  418. X.sp
  419. X.RE
  420. Xthen this can be infered for fred.o from the following inference rule:
  421. X.RS
  422. X.sp
  423. X%.o : %.c 'local.h' ; rule to make a .o from a .c
  424. X.sp
  425. X.RE
  426. XYou may infer indirect prerequisites that are a function of the value of '%'
  427. Xin the current rule.  The meta-rule:
  428. X.RS
  429. X.sp
  430. X%.o : %.c '$(INC)/%.h' ; rule to make a .o from a .c
  431. X.sp
  432. X.RE
  433. Xinfers an indirect prerequisite found in the INC directory whose name is the
  434. Xsame as the expansion of $(INC), and the prerequisite name depends on the
  435. Xbase name of the current target.
  436. XThe set of indirect prerequisites is attached to the meta rule in which they
  437. Xare specified and are inferred only if the rule is used to infer a recipe
  438. Xfor a target.  They do not play an active role in driving the inference
  439. Xalgorithm.
  440. XThe construct:
  441. X.RS
  442. X.sp
  443. X%.o : %.c %.f 'local.h'; recipe
  444. X.sp
  445. X.RE
  446. Xis equivalent to:
  447. X.RS
  448. X.sp
  449. X.nf
  450. X%.o : %.c 'local.h' : recipe
  451. X%.o : %.f 'local.h' : recipe
  452. X.fi
  453. X.sp
  454. X.RE
  455. X.PP
  456. XIf any of the attributes .SETDIR, .EPILOG, .PROLOG, .SILENT,
  457. X\&.USESHELL, .SWAP, .PRECIOUS, .LIBRARY, and .IGNORE
  458. Xare given for a %-rule then when that rule is bound to a target
  459. Xas the result of an inference, the target's set of attributes is augmented by
  460. Xthe attributes from the above set that are specified in the bound %-rule.
  461. XOther attributes specified for %-meta rules are not inherited by the target.
  462. XThe .SETDIR attribute is treated in a special way.
  463. XIf the target already had a .SETDIR attribute set and the bound %-rule also
  464. Xspecified a .SETDIR attribute then the one
  465. Xoriginally specified with the target prevails.
  466. XDuring inference any .SETDIR attributes for the inferred prerequisite
  467. Xare honored.
  468. XThe directories must exist for a %-meta rule to be selected as a possible
  469. Xinference path.  If the directories do not exist no error message is issued,
  470. Xinstead the corresponding path in the inference graph is simply rejected.
  471. X.PP
  472. X.B dmake
  473. Xalso supports the old format special target .<suffix>.<suffix>
  474. Xby identifying any rules
  475. Xof this form and mapping them to the appropriate %-rule.  So for example if
  476. Xan old makefile contains the construct:
  477. X.RS
  478. X.sp
  479. X\&.c.o :; cc -c $< -o $@
  480. X.sp
  481. X.RE
  482. X.B dmake
  483. Xmaps this into the following %-rule:
  484. X.RS
  485. X.sp
  486. X%.o : %.c; cc -c $< -o $@
  487. X.sp
  488. X.RE
  489. XFurthermore,
  490. X.B dmake
  491. Xunderstands several SYSV AUGMAKE special targets and maps them into
  492. Xcorresponding %-meta rules.  These transformation must be enabled by providing
  493. Xthe -A flag on the command line or by setting the value of AUGMAKE to non
  494. XNULL.
  495. XThe construct
  496. X.RS
  497. X.sp
  498. X\&.suff :; recipe
  499. X.sp
  500. X.RE
  501. Xgets mapped into:
  502. X.RS
  503. X.sp
  504. X% : %.suff; recipe
  505. X.sp
  506. X.RE
  507. Xand the construct
  508. X.RS
  509. X.sp
  510. X\&.c~.o :; recipe
  511. X.sp
  512. X.RE
  513. Xgets mapped into:
  514. X.RS
  515. X.sp
  516. X%.o : s.%.c ; recipe
  517. X.sp
  518. X.RE
  519. XIn general, a special target of the form .<str>~ is replaced by the %-rule
  520. Xconstruct s.%.<str>, thereby providing support for the syntax used by SYSV
  521. XAUGMAKE for providing SCCS support.
  522. XWhen enabled, these mappings allow processing of existing SYSV
  523. Xmakefiles without modifications.
  524. X.PP
  525. X.B dmake
  526. Xbases all of it's inferences on the inference graph constructed from the
  527. X%-rules defined in the makefile.
  528. XIt knows exactly which targets can be made from which prerequisites by
  529. Xmaking queries on the inference graph.  For this reason .SUFFIXES is not
  530. Xneeded and is completely ignored.
  531. X.PP
  532. XFor a %-meta rule to be inferred as the
  533. Xrule whose recipe will be used to make a target, the target's name must match
  534. Xthe %-target pattern, and any inferred %-prerequisite must already exist or
  535. Xhave an explicit recipe so that the prerequisite can be made.
  536. XWithout \fItransitive closure\fP on the inference graph the above rule
  537. Xdescribes precisely when an inference match terminates the search.
  538. XIf transitive closure is enabled (the usual case), and a prerequisite does
  539. Xnot exist or cannot be made, then
  540. X.B dmake
  541. Xinvokes the inference algorithm recursively on the prerequisite to see if
  542. Xthere is some way the prerequisite can be manufactured.  For if the
  543. Xprerequisite can be made then the current target can also be made using the
  544. Xcurrent %-meta rule.
  545. XThis means that there is no longer a need to give a rule
  546. Xfor making a .o from a .y if you have already given a rule for making a .o
  547. Xfrom a .c and a .c from a .y.  In such cases
  548. X.B dmake
  549. Xcan infer how to make the
  550. X\&.o from the .y via the intermediary .c and will remove the .c when the .o is
  551. Xmade.  Transitive closure can be disabled by giving the -T switch on the
  552. Xcommand line.
  553. X.PP
  554. XA word of caution.
  555. X.B dmake
  556. Xbases its transitive closure on the %-meta rule targets.
  557. XWhen it performs transitive closure it infers how to make a target from a
  558. Xprerequisite by performing a pattern match as if the potential prerequisite
  559. Xwere a new target.
  560. XThe set of rules:
  561. X.RS
  562. X.nf
  563. X.sp
  564. X%.o : %.c :; rule for making .o from .c
  565. X%.c : %.y :; rule for making .c from .y
  566. X% : RCS/%,v :; check out of RCS file
  567. X.fi
  568. X.sp
  569. X.RE
  570. Xwill, by performing transitive closure, allow \fBdmake\fP to infer how to make
  571. Xa .o from a .y using a .c as an intermediate temporary file.  Additionally
  572. Xit will be able to infer how to make a .y from an RCS file, as long as that
  573. XRCS file is in the RCS directory and has a name which ends in .y,v.
  574. XThe transitivity computation is performed dynamically for each target that
  575. Xdoes not have a recipe.  This has potential to be very slow if the %-meta
  576. Xrules are not carefully specified.  The .NOINFER attribute is used to mark
  577. Xa %-meta node as being a final target during inference.  Any node with this
  578. Xattribute set will not be used for subsequent inferences.  As an example
  579. Xthe node RCS/%,v is marked as a final node since we know that if the RCS file
  580. Xdoes not exist there likely is no other way to make it.  Thus the standard
  581. Xstartup makefile contains the entry:
  582. X.RS
  583. X.nf
  584. X\&.NOINFER : RCS/%,v
  585. X.fi
  586. X.RE
  587. XThereby indicating that the RCS file is the end of the inference chain.
  588. X.PP
  589. X.B dmake
  590. Xtries to
  591. Xremove intermediate files resulting from transitive closure if the file
  592. Xis not marked as being PRECIOUS, or the \fB-u\fP flag was not given on the
  593. Xcommand line, and if the inferred intermediate did not previously exist.
  594. XIntermediate targets that existed prior to being made are never removed.
  595. XThis is in keeping with the philosophy that
  596. X.B dmake
  597. Xshould never remove things from the file system that it did not add.
  598. XIf the special target .REMOVE is defined and has a recipe then
  599. X.B dmake
  600. Xconstructs a list of the intermediate files to be removed and makes them
  601. Xprerequisites of .REMOVE.  It then makes .REMOVE thereby removing the
  602. Xprerequisites if the recipe of .REMOVE says to.  Typically .REMOVE is defined
  603. Xin the startup file as:
  604. X.sp
  605. X\t".REMOVE :; $(RM) $<".
  606. X.SH "MAKING TARGETS"
  607. XIn order to update a target \fBdmake\fP must execute a recipe.
  608. XWhen a recipe needs to be executed it is first expanded so that any macros
  609. Xin the recipe text are expanded, and it is then either executed directly or
  610. Xpassed to a shell.
  611. X.B dmake
  612. Xsupports two types of recipes.  The regular recipes and group recipes.
  613. X.PP
  614. XWhen a regular recipe is invoked \fBdmake\fP executes each line of the recipe
  615. Xseparately using a new copy of a shell if a shell is required.
  616. XThus effects of commands do not generally persist across recipe lines.
  617. X(e.g. cd requests in a recipe line do not carry over to the next recipe line)
  618. XThe decision on whether a shell is required to execute a command is based on
  619. Xthe value of the macro SHELLMETAS or on the specification of '+' or .USESHELL
  620. Xfor the current recipe or target respectively.
  621. XIf any character in the value of
  622. XSHELLMETAS is found in the expanded recipe text-line or the use of a shell
  623. Xis requested explicitly via '+' or .USESHELL then the command is
  624. Xexecuted using a shell, otherwise the command is executed directly.
  625. XThe shell that is used for execution is given by the value of the macro SHELL.
  626. XThe flags that are passed to the shell are given by the value of SHELLFLAGS.
  627. XThus \fBdmake\fP constructs the command line:
  628. X.sp
  629. X\t$(SHELL) $(SHELLFLAGS) $(expanded_recipe_command)
  630. X.sp
  631. XNormally
  632. X.B dmake
  633. Xwrites the command line that it is about to invoke to standard output.
  634. XIf the .SILENT attribute is set for the target or for
  635. Xthe recipe line (via @), then the recipe line is not echoed.
  636. X.PP
  637. XGroup recipe processing is similar to that of regular recipes, except that
  638. Xa shell is always invoked.  The shell that is invoked is given by the value of
  639. Xthe macro GROUPSHELL, and its flags are taken from the value of the macro
  640. XGROUPFLAGS.  If a target has the .PROLOG attribute set then
  641. X.B dmake
  642. Xprepends to the shell script the recipe associated with the special target
  643. X\&.GROUPPROLOG, and if the attribute .EPILOG is set as well, then the recipe
  644. Xassociated with the special target .GROUPEPILOG is appended to the script
  645. Xfile.
  646. XThis facility can be used to always prepend a common header and common trailer
  647. Xto group recipes.
  648. XGroup recipes are echoed to standard output just like standard recipes, but
  649. Xare enclosed by lines beginning with [ and ].
  650. X.SH "MAKING LIBRARIES"
  651. XLibraries are easy to maintain using \fBdmake\fP.  A library is a file
  652. Xcontaining a collection of object files.
  653. XThus to make a library you simply specify it as a target with the .LIBRARY
  654. Xattribute set and specify its list of prerequisites.  The prerequisites should
  655. Xbe the object members that are to go into the library.  When
  656. X.B dmake
  657. Xmakes the library target it uses the .LIBRARY attribute to pass to the
  658. Xprerequisites the .LIBMEMBER attribute and the name of the library.  This
  659. Xenables the file binding mechanism to look for the member in the library if an
  660. Xappropriate object file cannot be found. A small example best illustrates
  661. Xthis.
  662. X.RS
  663. X.nf
  664. X.sp
  665. Xmylib.a .LIBRARY : mem1.o mem2.o mem3.o
  666. X\trules for making library...
  667. X\t# remember to remove .o's when lib is made
  668. X.sp
  669. X# equivalent to:  '%.o : %.c ; ...'
  670. X\&.c.o :; rules for making .o from .c say
  671. X.sp
  672. X.fi
  673. X.RE
  674. X.B dmake
  675. Xwill use the .c.o rule for making the library members if appropriate .c files
  676. Xcan be found using the search rules.  NOTE:  this is not specific in any way
  677. Xto C programs, they are simply used as an example.
  678. X.PP
  679. X.B dmake
  680. Xtries to handle the old library construct format in a sensible way.
  681. XThe construct 
  682. X.I lib(member.o)
  683. Xis separated and the \fIlib\fP portion is declared
  684. Xas a library target.
  685. XThe new target is defined
  686. Xwith the .LIBRARY attribute set and the \fImember.o\fP portion of the
  687. Xconstruct is
  688. Xdeclared as a prerequisite of the lib target.
  689. XIf the construct \fIlib(member.o)\fP
  690. Xappears as a prerequisite of a target in the
  691. Xmakefile, that target has the new name of the lib assigned as it's
  692. Xprerequisite.  Thus the following example:
  693. X.RS
  694. X.sp
  695. X.nf
  696. Xa.out : ml.a(a.o) ml.a(b.o); $(CC) -o $@  $<
  697. X
  698. X\&.c.o :; $(CC) -c $(CFLAGS) -o $@  $<
  699. X%.a:
  700. X\tar rv $@ $<
  701. X\tranlib $@
  702. X\trm -rf $<
  703. X.sp
  704. X.fi
  705. X.RE
  706. Xconstructs the following dependency
  707. Xgraph.
  708. X.RS
  709. X.sp
  710. X.nf
  711. Xa.out : ml.a; $(CC) -o $@  $<
  712. Xml.a .LIBRARY : a.o b.o
  713. X
  714. X%.o : %.c ; $(CC) -c $(CFLAGS) -o $@  $<
  715. X%.a :
  716. X\tar rv $@ $<
  717. X\tranlib $@
  718. X\trm -rf $<
  719. X.sp
  720. X.fi
  721. X.RE
  722. Xand making a.out then works as expected.
  723. X.PP
  724. XThe same thing happens for any target of the form \fIlib((entry))\fP.
  725. XThese targets have an
  726. Xadditional feature in that the \fIentry\fP target has the .SYMBOL attribute
  727. Xset automatically.
  728. X.PP
  729. XNOTE:  If the notion of entry points is supported by the archive and by
  730. X\fBdmake\fP (currently not the case) then
  731. X.B dmake
  732. Xwill search the archive for the entry point and return not only the
  733. Xmodification time of the member which defines the entry but also the name of
  734. Xthe member file.  This name will then replace \fIentry\fP and will be used for
  735. Xmaking the member file.  Once bound to an archive member the .SYMBOL
  736. Xattribute is removed from the target.
  737. XThis feature is presently disabled as there is little standardization
  738. Xamong archive formats, and we have yet to find a makefile utilizing this
  739. Xfeature (possibly due to the fact that it is unimplemented in most versions
  740. Xof UNIX Make).
  741. X.SH "MULTI PROCESSING"
  742. XIf the architecture supports it then \fBdmake\fP is capable of making a target's
  743. Xprerequisites in parallel.  \fBdmake\fP will make as much in parallel as it
  744. Xcan and use a number of child processes up to the maximum specified by
  745. XMAXPROCESS or by the value supplied to the -P command line flag.
  746. XA parallel make is enabled by setting the value of MAXPROCESS (either directly
  747. Xor via -P option) to a value which is > 1.
  748. X\fBdmake\fP guarantees that all dependencies as specified in the makefile are
  749. Xhonored.  A target will not be made until all of its prerequisites have been
  750. Xmade.
  751. XIf a parallel make is being performed then the following restrictions on
  752. Xparallelism are enforced.
  753. X.RS
  754. X.IP 1.
  755. XIndividual recipe lines in a non-group recipe are performed sequentially in
  756. Xthe order in which they are specified within the makefile and in parallel with
  757. Xthe recipes of other targets.
  758. X.IP 2.
  759. XIf a target contains multiple recipe definitions (cf. :: rules) then these are
  760. Xperformed sequentially in the order in which the :: rules are specified within
  761. Xthe makefile and in parallel with the recipes of other targets.
  762. X.IP 3.
  763. XIf a target rule contains the `!' modifier, then the recipe is performed
  764. Xsequentially for the list of outdated prerequisites and in parallel with the
  765. Xrecipes of other targets.
  766. X.IP 4.
  767. XIf a target has the .SEQUENTIAL attribute set then all of its prerequisites
  768. Xare made sequentially relative to one another (as if MAXPROCESS=1), but in
  769. Xparallel with other targets in the makefile.
  770. X.RE
  771. X.PP
  772. XNote:  If you specify a parallel make then
  773. Xthe order of target update and the order in which the associated recipes are
  774. Xinvoked will not correspond to that displayed by the -n flag.
  775. X.SH "CONDITIONALS"
  776. X.B dmake
  777. Xsupports a makefile construct called a \fIconditional\fR.  It allows
  778. Xthe user
  779. Xto conditionally select portions of makefile text for input processing
  780. Xand to discard other portions.  This becomes useful for
  781. Xwriting makefiles that are intended to function for more than one target
  782. Xhost and environment.  The conditional expression is specified as follows:
  783. X.sp
  784. X.RS
  785. X.nf
  786. X\&.IF  \fIexpression\fR
  787. X   ... if text ...
  788. X\&.ELSE
  789. X   ... else text ...
  790. X\&.END
  791. X.RE
  792. X.fi
  793. X.sp
  794. XThe .ELSE portion is optional, and the conditionals may be nested (ie.
  795. Xthe text may contain another conditional).
  796. X\&.IF, .ELSE, and .END
  797. Xmay appear anywhere in the makefile, but a single conditional expression
  798. Xmay not span multiple makefiles.
  799. X.PP
  800. X\fIexpression\fR can be one of the following three forms:
  801. X.sp
  802. X\t<text> | <text> == <text> | <text> != <text>
  803. X.sp
  804. Xwhere \fItext\fR is either text or a macro expression.  In any case,
  805. Xbefore the comparison is made, the expression is expanded.  The text
  806. Xportions are then selected and compared.  White space at the start and
  807. Xend of the text portion is discarded before the comparison.  This means
  808. Xthat a macro that evaluates to nothing but white space is considered a
  809. XNULL value for the purpose of the comparison.
  810. XIn the first case the expression evaluates TRUE if the text is not NULL
  811. Xotherwise it evaluates FALSE.  The remaining two cases both evaluate the
  812. Xexpression on the basis of a string comparison.
  813. XIf a macro expression needs to be equated to a NULL string then compare it to
  814. Xthe value of the macro $(NULL).
  815. X.SH "EXAMPLES"
  816. X.RS
  817. X.nf
  818. X.sp
  819. X# A simple example showing how to use make
  820. X#
  821. Xprgm : a.o b.o
  822. X    cc a.o b.o -o prgm
  823. Xa.o : a.c g.h
  824. X    cc a.c -o $@
  825. Xb.o : b.c g.h
  826. X    cc b.c -o $@
  827. X.fi
  828. X.RE
  829. X.sp
  830. XIn the previous
  831. Xexample prgm is remade only if a.o and/or b.o is out of date with
  832. Xrespect to prgm.
  833. XThese dependencies can be stated more concisely
  834. Xby using the inference rules defined in the standard startup file.
  835. XThe default rule for making .o's from .c's looks something like this:
  836. X.sp
  837. X\&\t%.o : %.c; cc -c $(CFLAGS) -o $@ $<
  838. X.sp
  839. XSince there exists a rule (defined in the startup file)
  840. Xfor making .o's from .c's
  841. X\fBdmake\fR will use that rule
  842. Xfor manufacturing a .o from a .c and we can specify our dependencies
  843. Xmore concisely.
  844. X.sp
  845. X.RS
  846. X.nf
  847. Xprgm : a.o b.o
  848. X    cc -o prgm $<
  849. Xa.o b.o : g.h
  850. X.fi
  851. X.RE
  852. X.sp
  853. XA more general way to say the above using the new macro expansions
  854. Xwould be:
  855. X.sp
  856. X.RS
  857. X.nf
  858. XSRC = a b
  859. XOBJ = {$(SRC)}.o
  860. X.sp
  861. Xprgm : $(OBJ)
  862. X    cc -o $@ $<
  863. X.sp
  864. X$(OBJ) : g.h
  865. X.fi
  866. X.RE
  867. X.sp
  868. XIf we want to keep the objects in a separate directory, called
  869. Xobjdir, then we would write
  870. Xsomething like this.
  871. X.sp
  872. X.RS
  873. X.nf
  874. XSRC = a b
  875. XOBJ = {$(SRC)}.o
  876. X.sp
  877. Xprgm : $(OBJ)
  878. X    cc $< -o $@
  879. X.sp
  880. X$(OBJ) : g.h
  881. X\&%.o : %.c
  882. X    $(CC) -c $(CFLAGS) -o $(@:f) $<
  883. X    mv $(@:f) objdir
  884. X
  885. X\&.SOURCE.o : objdir        # tell make to look here for .o's
  886. X.fi
  887. X.RE
  888. X.sp
  889. XAn example of building library members would go something like this:
  890. X(NOTE:  The same rules as above will be used to produce .o's from .c's)
  891. X.sp
  892. X.RS
  893. X.nf
  894. XSRC\t= a b
  895. XLIB\t= lib
  896. XLIBm\t= { $(SRC) }.o
  897. X.sp
  898. Xprgm: $(LIB)
  899. X    cc -o $@ $(LIB)
  900. X.sp
  901. X$(LIB) .LIBRARY : $(LIBm)
  902. X    ar rv $@ $<
  903. X    rm $<
  904. X.fi
  905. X.RE
  906. X.sp
  907. XFinally, suppose that each of the source files in the previous example had
  908. Xthe `:' character in their target name.  Then we would write the above example
  909. Xas:
  910. X.sp
  911. X.RS
  912. X.nf
  913. XSRC\t= f:a f:b
  914. XLIB\t= lib
  915. XLIBm\t= "{ $(SRC) }.o"        # put quotes around each token
  916. X.sp
  917. Xprgm: $(LIB)
  918. X    cc -o $@ $(LIB)
  919. X.sp
  920. X$(LIB) .LIBRARY : $(LIBm)
  921. X    ar rv $@ $<
  922. X    rm $<
  923. X.fi
  924. X.RE
  925. X.SH "COMPATIBILITY"
  926. XThere are two notable differences between 
  927. X.B \fBdmake\fR
  928. Xand the standard version of BSD UNIX 4.2/4.3 Make.
  929. X.RS
  930. X.IP 1. .3i
  931. XBSD UNIX 4.2/4.3 Make supports wild card filename expansion for
  932. Xprerequisite names.  Thus if a directory contains a.h, b.h and c.h, then a
  933. Xline like
  934. X.sp
  935. X\ttarget: *.h
  936. X.sp
  937. Xwill cause UNIX make to expand the *.h into "a.h b.h c.h".  \fBdmake\fR
  938. Xdoes not support this type of filename expansion.
  939. X.IP 2. .3i
  940. XUnlike UNIX make, touching a library member causes \fBdmake\fR
  941. Xto search the library for the member name and to update the library time stamp.
  942. XThis is only implemented in the UNIX version.
  943. XMSDOS and other versions may not have librarians that keep file time stamps,
  944. Xas a result \fBdmake\fR touches the library file itself, and prints a warning.
  945. X.RE
  946. X.PP
  947. X\fBdmake\fP is not compatible with GNU Make.  In particular it does not
  948. Xunderstand GNU Make's macro expansions that query the file system.
  949. X.PP
  950. X.B dmake
  951. Xis fully compatible with SYSV AUGMAKE, and supports the following AUGMAKE
  952. Xfeatures:
  953. X.RS
  954. X.IP 1. .3i
  955. XThe word \fBinclude\fP appearing at the start of a line can be used instead of
  956. Xthe ".INCLUDE :" construct understood by \fBdmake\fP.
  957. X.IP 2. .3i
  958. XThe macro modifier expression $(macro:str=sub) is understood and is equivalent
  959. Xto the expression $(macro:s/str/sub), with the restriction that str must match
  960. Xthe following regular expression:
  961. X.sp
  962. X\tstr[ |\\t][ |\\t]*
  963. X.sp
  964. X(ie. str only matches at the end of a token where str is a suffix and is
  965. Xterminated by a space, a tab, or end of line)
  966. X.IP 3.
  967. XThe macro % is defined to be $@ (ie. $% expands to the same value as $@).
  968. X.IP 4.
  969. XThe AUGMAKE notion of libraries is handled correctly.
  970. X.IP 5.
  971. XWhen defining special targets for the inference rules and the AUGMAKE special
  972. Xtarget mapping is enabled then the special target
  973. X\&.X is equivalent to the %-rule "% : %.X".
  974. X.RE
  975. X.SH "LIMITS"
  976. XIn some environments the length of an argument string is restricted.
  977. X(e.g. MSDOS command line arguments cannot be longer than 128 bytes if you are
  978. Xusing the standard command.com command interpreter as your shell,
  979. X.B dmake
  980. Xtext diversions may help in these situations.)
  981. X.SH "PORTABILITY"
  982. XTo write makefiles that can be moved from one environment to another requires
  983. Xsome forethought.  In particular you must define as macros all those things
  984. Xthat may be different in the new environment.
  985. X.B dmake
  986. Xhas two facilities that help to support writing portable makefiles, recursive
  987. Xmacros and conditional expressions.  The recursive macros, allow one to define
  988. Xenvironment configurations that allow different environments for similar types
  989. Xof operating systems.  For example the same make script can be used for SYSV and
  990. XBSD but with different macro definitions.
  991. X.PP
  992. XTo write a makefile that is portable between UNIX and MSDOS requires both
  993. Xfeatures since in almost all cases you will need to define new recipes for
  994. Xmaking targets.  The recipes will probably be quite different since the
  995. Xcapabilities of the tools on each machine are different.  Different
  996. Xmacros will be needed to help handle the smaller differences in the two
  997. Xenvironments.
  998. X.PP
  999. XNOTE:  Unlike UNIX, MSDOS \fBdoes\fP maintain cd requests
  1000. Xcross single recipe lines.
  1001. XThis is not portable, and your makefiles will not work the same way if you
  1002. Xdepend on it.  Use the .IF ... .ELSE ... .END conditionals to supply different
  1003. Xmake scripts as necessary.
  1004. X.SH FILES
  1005. XMakefile, makefile, startup.mk (use dmake -V to tell you where the startup
  1006. Xfile is)
  1007. X.SH "SEE ALSO"
  1008. Xsh(1), csh(1), touch(1), f77(1), pc(1), cc(1)
  1009. X.br
  1010. XS.I. Feldman  \fIMake - A Program for Maintaining Computer Programs\fP
  1011. X.SH "AUTHOR"
  1012. XDennis Vadura, CS Dept. University of Waterloo. dvadura@watdragon.uwaterloo.ca
  1013. X.br
  1014. XMany thanks to Carl Seger for his helpful suggestions,
  1015. Xand to Trevor John Thompson for his many excellent ideas and
  1016. Xinformative bug reports.
  1017. X.SH BUGS
  1018. XSome system commands return non-zero status inappropriately.
  1019. XUse
  1020. X.B \-i
  1021. X(`\-' within the makefile) to overcome the difficulty.
  1022. X.PP
  1023. XSome systems do not have easily accessible
  1024. Xtime stamps for library members (MSDOS, AMIGA, etc)
  1025. Xfor these \fBdmake\fR uses the time stamp of the library instead and prints
  1026. Xa warning the first time it does so.  This is almost always ok, except when
  1027. Xmultiple makefiles update a single library file.  In these instances it is
  1028. Xpossible to miss an update if one is not careful.
  1029. SHAR_EOF
  1030. echo "File man/dmake.tf is complete"
  1031. chmod 0440 man/dmake.tf || echo "restore of man/dmake.tf fails"
  1032. echo "x - extracting man/dmake.p (Text)"
  1033. sed 's/^X//' << 'SHAR_EOF' > man/dmake.p &&
  1034. X
  1035. X
  1036. X
  1037. X
  1038. XDMAKE(p)               Unsupported Software               DMAKE(p)
  1039. X
  1040. X
  1041. X
  1042. XNNAAMMEE
  1043. X     ddmmaakkee - maintain program groups, or interdependent files
  1044. X
  1045. XSSYYNNOOPPSSIISS
  1046. X     ddmmaakkee [-AeEhiknpqersStTuvVx] [-P#] [macro[*][+][:]=_v_a_l_u_e]
  1047. X     [-f file] [target ...]
  1048. X
  1049. XDDEESSCCRRIIPPTTIIOONN
  1050. X     ddmmaakkee executes commands found in an external file called a
  1051. X     _m_a_k_e_f_i_l_e to update one or more target names.  Each target
  1052. X     may depend on zero or more prerequisite targets.  If any of
  1053. X     the target's prerequisites is newer than the target or if
  1054. X     the target itself does not exist, then ddmmaakkee will attempt to
  1055. X     make the target.
  1056. X
  1057. X     If no --ff command line option is present then ddmmaakkee searches
  1058. X     for an existing _m_a_k_e_f_i_l_e from the list of prerequisites
  1059. X     specified for the special target _._M_A_K_E_F_I_L_E_S (see the STARTUP
  1060. X     section for more details).  If "-" is the name of the file
  1061. X     specified to the --ff flag then ddmmaakkee uses standard input as
  1062. X     the source of the makefile text.
  1063. X
  1064. X     Any macro definitions (arguments with embedded "=" signs)
  1065. X     that appear on the command line are processed first and
  1066. X     supercede definitions for macros of the same name found
  1067. X     within the makefile.  In general it is impossible for defin-
  1068. X     itions found inside the makefile to redefine a macro defined
  1069. X     on the command line, see the MACROS section for an excep-
  1070. X     tion.
  1071. X
  1072. X     If no _t_a_r_g_e_t names are specified on the command line, then
  1073. X     ddmmaakkee uses the first non-special target found in the
  1074. X     makefile as the default target.  See the SSPPEECCIIAALL TTAARRGGEETTSS
  1075. X     section for the list of special targets and their function.
  1076. X     ddmmaakkee is a re-implementation of the UNIX Make utility with
  1077. X     significant enhancements.  Makefiles written for most previ-
  1078. X     ous versions of _m_a_k_e will be handled correctly by ddmmaakkee..
  1079. X     Known differences between ddmmaakkee and other versions of make
  1080. X     are discussed in the CCOOMMPPAATTIIBBIILLIITTYY section found at the end
  1081. X     of this document.
  1082. X
  1083. XOOPPTTIIOONNSS
  1084. X     --AA   Enable AUGMAKE special inference rule transformations
  1085. X          (see the "PERCENT(%) RULES" section), these are set to
  1086. X          off by default.
  1087. SHAR_EOF
  1088. echo "End of part 12"
  1089. echo "File man/dmake.p is continued in part 13"
  1090. echo "13" > s2_seq_.tmp
  1091. exit 0
  1092.  
  1093.